#include "thread_pool.h"
#include <stdlib.h>
#include <stdio.h>

// 工作线程函数
// 线程主体，进入任务队列并执行相关任务
void *worker_thread(void *arg) {
    ThreadPool *pool = (ThreadPool *)arg; // 转换为 ThreadPool 类型
    while (1) {
        Task task;
        // 从任务队列获取一个任务
        if (task_queue_pop(pool->task_queue, &task) != 0) {
            continue; // 如果没有任务，继续循环
        }
        if (pool->stop) break; // 如果池已停止，退出工作线程
        task.function(task.arg); // 执行任务
    }
    return NULL;
}

// 创建线程池
// 参数为线程数量和队列容量
ThreadPool *thread_pool_create(int thread_count, int queue_capacity) {
    ThreadPool *pool = (ThreadPool *)malloc(sizeof(ThreadPool)); // 为线程池分配内存
    pool->threads = (pthread_t *)malloc(sizeof(pthread_t) * thread_count); // 分配线程数组
    pool->task_queue = task_queue_create(queue_capacity); // 创建任务队列
    pool->thread_count = thread_count; // 设置线程总数
    pool->stop = 0; // 初始化停止标志

    for (int i = 0; i < thread_count; i++) {
        pthread_create(&pool->threads[i], NULL, worker_thread, pool); // 创建线程
    }
    return pool;
}

// 销毁线程池
// 停止所有线程，释放资源
void thread_pool_destroy(ThreadPool *pool) {
    pool->stop = 1; // 标记停止线程池
    pthread_cond_broadcast(&pool->task_queue->not_empty); // 唤醒所有等待任务的线程
    for (int i = 0; i < pool->thread_count; i++) {
        pthread_join(pool->threads[i], NULL); // 等待线程结束
    }
    task_queue_destroy(pool->task_queue); // 销毁任务队列
    free(pool->threads); // 释放线程数组
    free(pool); // 释放线程池结构
}

// 增加任务到线程池
// 输入函数指针和参数，将任务加入队列
int thread_pool_add_task(ThreadPool *pool, void (*function)(void *), void *arg) {
    Task task;
    task.function = function; // 设置函数指针
    task.arg = arg;          // 设置函数参数
    return task_queue_push(pool->task_queue, task); // 将任务插入队列
}
